use std::{collections::HashMap, sync::Arc};
use tokio::sync::{Mutex, MutexGuard};

use once_cell::sync::OnceCell;
/// 命名锁管理器，用于根据名称获取对应的锁
pub struct NamedLockManager {
    locks: Mutex<HashMap<String, Arc<Mutex<()>>>>,
}

impl NamedLockManager {
    /// 创建一个新的命名锁管理器
    pub fn new() -> Self {
        Self {
            locks: Mutex::new(HashMap::new()),
        }
    }
    /// 根据名称获取锁，如果不存在则创建
    pub async fn get_lock(&self,name:&str) -> Arc<Mutex<()>> {
        let mut locks = self.locks.lock().await;
        locks
            .entry(name.to_string())
            .or_insert_with(|| Arc::new(Mutex::new(())))
            .clone()
    }
}

static NAMED_LOCK: OnceCell<Mutex<NamedLockManager>> = OnceCell::new();
// 提供全局访问
pub async fn get_named_lock_manager() -> Arc<MutexGuard<'static, NamedLockManager>> {
    let instance=NAMED_LOCK.get_or_init(|| {
        Mutex::new(NamedLockManager::new())
    })
    .lock().await;
    Arc::new(instance)
}